//package com.wanmait.teatrain.utils;
//
//import org.apache.commons.io.FilenameUtils;
//import org.apache.pdfbox.pdmodel.PDDocument;
//import org.apache.pdfbox.pdmodel.PDPage;
//import org.apache.pdfbox.pdmodel.PDPageContentStream;
//import org.apache.pdfbox.pdmodel.font.PDType0Font;
//import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;
//import org.apache.poi.hwpf.HWPFDocument;
//import org.apache.poi.hwpf.extractor.WordExtractor;
//import org.apache.poi.xslf.usermodel.XMLSlideShow;
//import org.apache.poi.xslf.usermodel.XSLFSlide;
//import org.apache.poi.xwpf.usermodel.XWPFDocument;
//import org.apache.poi.xwpf.usermodel.XWPFParagraph;
//
//import javax.imageio.ImageIO;
//import java.awt.*;
//import java.awt.geom.Rectangle2D;
//import java.awt.image.BufferedImage;
//import java.io.*;
//import java.nio.charset.StandardCharsets;
//import java.util.UUID;
//
//public class FileToPdfConverter {
//
//    // 中文字体路径（需在resources下放置simhei.ttf字体文件）
//    private static final String FONT_PATH = "fonts/SourceHanSansSC-VF.ttf";
//
//    /**
//     * 通用转换入口
//     */
//    public static String convertToPdf(File file, String outputDir) throws Exception {
//        // 确保输出目录存在
//        File outputDirectory = new File(outputDir);
//        if (!outputDirectory.exists()) {
//            outputDirectory.mkdirs();
//        }
//
//        String fileName = file.getName();
//        String suffix = FilenameUtils.getExtension(fileName).toLowerCase();
//        String pdfFileName = UUID.randomUUID().toString() + ".pdf";
//        String pdfPath = outputDir + File.separator + pdfFileName;
//
//        switch (suffix) {
//            case "txt":
//                txtToPdf(new FileInputStream(file), pdfPath);
//                break;
//            case "doc":
//                docToPdf(new FileInputStream(file), pdfPath);
//                break;
//            case "docx":
//                docxToPdf(new FileInputStream(file), pdfPath);
//                break;
//            case "ppt":
//            case "pptx":
//                pptToPdf(new FileInputStream(file), pdfPath);
//                break;
//            case "pdf":
//                // 直接复制PDF
//                copyFile(file, new File(pdfPath));
//                break;
//            default:
//                throw new IllegalArgumentException("不支持的文件格式: " + suffix);
//        }
//        return pdfFileName;
//    }
//
//    // 文件复制工具方法
//    private static void copyFile(File source, File dest) throws IOException {
//        try (InputStream is = new FileInputStream(source);
//             OutputStream os = new FileOutputStream(dest)) {
//            byte[] buffer = new byte[1024];
//            int length;
//            while ((length = is.read(buffer)) > 0) {
//                os.write(buffer, 0, length);
//            }
//        }
//    }
//
//    // TXT转PDF（使用PDFBox实现，避免iText依赖问题）
//    private static void txtToPdf(InputStream inputStream, String pdfPath) throws IOException {
//        try (PDDocument document = new PDDocument()) {
//            PDPage page = new PDPage();
//            document.addPage(page);
//            PDType0Font font = loadFont(document);
//
//            PDPageContentStream contentStream = new PDPageContentStream(document, page);
//            try (BufferedReader br = new BufferedReader(
//                    new InputStreamReader(inputStream, StandardCharsets.UTF_8))) {
//
//                contentStream.beginText();
//                contentStream.setFont(font, 12);
//                contentStream.newLineAtOffset(50, 700); // 起始位置
//
//                String line;
//                float yPosition = 700;
//                float lineHeight = 15;
//                float marginBottom = 50;
//
//                while ((line = br.readLine()) != null) {
//                    // 检查是否需要新页面
//                    if (yPosition < marginBottom) {
//                        contentStream.endText();
//                        contentStream.close(); // 手动关闭当前流
//
//                        page = new PDPage();
//                        document.addPage(page);
//                        // 重新创建流（此时可以赋值，因为未使用try-with-resources声明）
//                        contentStream = new PDPageContentStream(document, page);
//                        contentStream.beginText();
//                        contentStream.setFont(font, 12);
//                        yPosition = 700;
//                        contentStream.newLineAtOffset(50, yPosition); // 重置起始位置
//                    }
//
//                    contentStream.newLineAtOffset(0, -lineHeight);
//                    String cleanedLine = cleanSpecialChars(line);
//                    contentStream.showText(cleanedLine);
//                    yPosition -= lineHeight;
//                }
//                contentStream.endText();
//            } finally {
//                if (contentStream != null) {
//                    contentStream.close(); // 确保最后关闭流
//                }
//            }
//            document.save(pdfPath);
//        }
//    }
//
//    // Word(.doc)转PDF
//    private static void docToPdf(InputStream inputStream, String pdfPath) throws IOException {
//        try (HWPFDocument doc = new HWPFDocument(inputStream);
//             PDDocument pdfDoc = new PDDocument()) {
//            WordExtractor extractor = new WordExtractor(doc);
//            String[] paragraphs = extractor.getParagraphText();
//
//            PDType0Font font = loadFont(pdfDoc);
//            float yPosition = 700;
//            PDPage page = new PDPage();
//            pdfDoc.addPage(page);
//            PDPageContentStream contentStream = new PDPageContentStream(pdfDoc, page);
//            contentStream.beginText();
//            contentStream.setFont(font, 12);
//            contentStream.newLineAtOffset(50, yPosition);
//
//            for (String para : paragraphs) {
//                if (para.trim().isEmpty()) continue;
//
//                // 检查是否需要新页面
//                if (yPosition < 100) {
//                    contentStream.endText();
//                    contentStream.close();
//
//                    page = new PDPage();
//                    pdfDoc.addPage(page);
//                    contentStream = new PDPageContentStream(pdfDoc, page);
//                    contentStream.beginText();
//                    contentStream.setFont(font, 12);
//                    yPosition = 700;
//                    contentStream.newLineAtOffset(50, yPosition);
//                }
//
//                contentStream.newLineAtOffset(0, -20);
//                String cleanedPara = cleanSpecialChars(para.replaceAll("\\cM?", ""));
//                contentStream.showText(cleanedPara);
//                yPosition -= 20;
//            }
//
//            contentStream.endText();
//            contentStream.close();
//            pdfDoc.save(pdfPath);
//        }
//    }
//
//    // Word(.docx)转PDF
//    private static void docxToPdf(InputStream inputStream, String pdfPath) throws IOException {
//        try (XWPFDocument doc = new XWPFDocument(inputStream);
//             PDDocument pdfDoc = new PDDocument()) {
//            PDType0Font font = loadFont(pdfDoc);
//            float yPosition = 700;
//            PDPage page = new PDPage();
//            pdfDoc.addPage(page);
//            PDPageContentStream contentStream = new PDPageContentStream(pdfDoc, page);
//            contentStream.beginText();
//            contentStream.setFont(font, 12);
//            contentStream.newLineAtOffset(50, yPosition);
//
//            for (XWPFParagraph para : doc.getParagraphs()) {
//                String text = cleanSpecialChars(para.getText());
//                if (text.trim().isEmpty()) continue;
//
//                // 检查是否需要新页面
//                if (yPosition < 100) {
//                    contentStream.endText();
//                    contentStream.close();
//
//                    page = new PDPage();
//                    pdfDoc.addPage(page);
//                    contentStream = new PDPageContentStream(pdfDoc, page);
//                    contentStream.beginText();
//                    contentStream.setFont(font, 12);
//                    yPosition = 700;
//                    contentStream.newLineAtOffset(50, yPosition);
//                }
//
//                contentStream.newLineAtOffset(0, -20);
//                contentStream.showText(text);
//                yPosition -= 20;
//            }
//
//            contentStream.endText();
//            contentStream.close();
//            pdfDoc.save(pdfPath);
//        }
//    }
//
//    // PPT转PDF（将每页转为图片插入PDF）
//    private static void pptToPdf(InputStream inputStream, String pdfPath) throws IOException {
//        try (XMLSlideShow ppt = new XMLSlideShow(inputStream);
//             PDDocument pdfDoc = new PDDocument()) {
//            Dimension pageSize = ppt.getPageSize();
//
//            for (XSLFSlide slide : ppt.getSlides()) {
//                // 幻灯片转图片
//                BufferedImage image = new BufferedImage(
//                        pageSize.width, pageSize.height, BufferedImage.TYPE_INT_RGB);
//                Graphics2D g = image.createGraphics();
//                g.setPaint(Color.WHITE);
//                g.fill(new Rectangle2D.Float(0, 0, pageSize.width, pageSize.height));
//                slide.draw(g);
//                g.dispose();
//
//                // 图片插入PDF
//                PDPage page = new PDPage(new org.apache.pdfbox.pdmodel.common.PDRectangle(
//                        pageSize.width, pageSize.height));
//                pdfDoc.addPage(page);
//
//                try (PDPageContentStream contentStream = new PDPageContentStream(pdfDoc, page)) {
//                    // 保存图片到临时文件
//                    File tempImage = File.createTempFile("slide", ".png");
//                    ImageIO.write(image, "png", tempImage);
//
//                    // 读取图片并写入PDF
//                    PDImageXObject pdImage = PDImageXObject.createFromFileByContent(tempImage, pdfDoc);
//                    contentStream.drawImage(pdImage, 0, 0, pageSize.width, pageSize.height);
//
//                    // 清理临时文件
//                    tempImage.delete();
//                }
//            }
//            pdfDoc.save(pdfPath);
//        }
//    }
//
//    // 加载中文字体（解决乱码）
//    private static PDType0Font loadFont(PDDocument doc) throws IOException {
//        try (InputStream fontStream = FileToPdfConverter.class.getClassLoader().getResourceAsStream(FONT_PATH)) {
//            if (fontStream == null) {
//                throw new FileNotFoundException("未找到字体文件: " + FONT_PATH +
//                        "，请在resources目录下创建fonts文件夹并放入simhei.ttf字体文件");
//            }
//            return PDType0Font.load(doc, fontStream);
//        }
//    }
//
//    /**
//     * 清理文本中的特殊控制字符（保留换行、空格等基本格式字符）
//     * 避免因字体不支持导致的转换失败
//     */
//    private static String cleanSpecialChars(String text) {
//        if (text == null) {
//            return "";
//        }
//        // 正则说明：
//        // \p{C} 匹配所有 Unicode 控制字符（包括不可见字符）
//        // 排除 \r（回车）、\n（换行）、\t（制表符）、空格，其余控制字符替换为空格
//        return text.replaceAll("[\\p{C}&&[^\\r\\n\\t ]]", " ")
//                // 合并连续空格（可选，优化排版）
//                .replaceAll("\\s+", " ");
//    }
//}
